#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""PDF提取示例脚本"""

import os
import sys
import json
import argparse
import requests
from pathlib import Path

# 添加项目根目录到路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

def extract_pdf(pdf_path, api_url="http://localhost:8080/api/pdf/extract", apply_rules=True):
    """提取PDF数据
    
    Args:
        pdf_path: PDF文件路径
        api_url: API地址
        apply_rules: 是否应用规则
        
    Returns:
        提取结果
    """
    # 检查文件是否存在
    if not os.path.exists(pdf_path):
        print(f"错误: 文件不存在 - {pdf_path}")
        return None
    
    # 检查文件是否为PDF
    if not pdf_path.lower().endswith(".pdf"):
        print(f"错误: 文件不是PDF - {pdf_path}")
        return None
    
    # 构建请求参数
    params = {"apply_rules": "true" if apply_rules else "false"}
    
    # 发送请求
    try:
        with open(pdf_path, "rb") as f:
            files = {"file": (os.path.basename(pdf_path), f, "application/pdf")}
            response = requests.post(api_url, params=params, files=files)
        
        # 检查响应
        response.raise_for_status()
        
        # 解析结果
        result = response.json()
        return result
    
    except requests.exceptions.RequestException as e:
        print(f"请求错误: {str(e)}")
        return None
    except Exception as e:
        print(f"处理错误: {str(e)}")
        return None

def save_result(result, output_path):
    """保存结果到文件
    
    Args:
        result: 提取结果
        output_path: 输出文件路径
    """
    try:
        with open(output_path, "w", encoding="utf-8") as f:
            json.dump(result, f, ensure_ascii=False, indent=2)
        print(f"结果已保存到: {output_path}")
    except Exception as e:
        print(f"保存结果错误: {str(e)}")

def print_summary(result):
    """打印结果摘要
    
    Args:
        result: 提取结果
    """
    if not result:
        print("无结果")
        return
    
    # 打印元数据
    metadata = result.get("metadata", {})
    print("\n=== PDF元数据 ===")
    print(f"文件名: {metadata.get('filename', '未知')}")
    print(f"页数: {metadata.get('page_count', 0)}")
    print(f"标题: {metadata.get('title', '未知')}")
    print(f"作者: {metadata.get('author', '未知')}")
    print(f"创建时间: {metadata.get('created_at', '未知')}")
    
    # 打印表格信息
    tables = result.get("tables", [])
    print(f"\n=== 提取的表格 ({len(tables)}) ===")
    for i, table in enumerate(tables):
        print(f"表格 {i+1}:")
        print(f"  标题: {table.get('title', '未知')}")
        print(f"  页码: {table.get('page', 0)}")
        print(f"  行数: {table.get('rows', 0)}")
        print(f"  列数: {table.get('cols', 0)}")
        if table.get("headers"):
            print(f"  表头: {', '.join(str(h) for h in table['headers'] if h)}")
    
    # 打印处理后的表格信息
    processed_tables = result.get("processed_tables", [])
    if processed_tables:
        print(f"\n=== 处理后的表格 ({len(processed_tables)}) ===")
        for i, table in enumerate(processed_tables):
            print(f"表格 {i+1}:")
            print(f"  规则: {table.get('rule_name', '未知')}")
            print(f"  类型: {table.get('data_type', '未知')}")
            
            # 打印处理后的数据摘要
            processed_data = table.get("processed_data", {})
            if processed_data:
                print("  数据摘要:")
                for key, value in list(processed_data.items())[:5]:  # 只显示前5个
                    print(f"    {key}: {value}")
                if len(processed_data) > 5:
                    print(f"    ... 等{len(processed_data)-5}项")

def main():
    """主函数"""
    # 解析命令行参数
    parser = argparse.ArgumentParser(description="PDF数据提取示例")
    parser.add_argument("pdf_path", help="PDF文件路径")
    parser.add_argument("--url", default="http://localhost:8080/api/pdf/extract", help="API地址")
    parser.add_argument("--no-rules", action="store_true", help="不应用规则")
    parser.add_argument("--output", "-o", help="输出文件路径")
    args = parser.parse_args()
    
    # 提取PDF数据
    result = extract_pdf(args.pdf_path, args.url, not args.no_rules)
    
    if result:
        # 打印摘要
        print_summary(result)
        
        # 保存结果
        if args.output:
            save_result(result, args.output)

if __name__ == "__main__":
    main()